<?php
require_once('utils.php');

/*
Gestion de la table AppParam (paramètres de l'application en BD)
Modèle:
  `key` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `value` text COLLATE utf8_unicode_ci NOT NULL,
  `type` enum('init','page','mail','other') COLLATE utf8_unicode_ci NOT NULL,
  `date` int(11) NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`key`)
*/

/**
 * Récupérer un ou plusieurs paramètres de la table AppParam
 * @param key: l'identifiant unique de le paramètre que l'on recherche.
 * @param type: l'identifiant unique de le paramètre que l'on recherche.
 * @note: si $key!='', renvoie que le param avec la clé spécifiée et ignore $type,
 * 		  sinon si $type!='' renvoie tous les param du type spécifié, sinon
 * 		  renvoie tous les param
 * @return un ou plusieurs paramètres
 */
function appparam_get($key = '', $type = '')
{
	$key = mysql_real_escape_string($key);
	$type = mysql_real_escape_string($type);
	
	$sql = 'SELECT `key`, `value`, `type`
			FROM `AppParam`
			WHERE `active` = 1';
			
	if($key != '') {
		$sql .= "\nAND `key` = '$key' LIMIT 1;";
		return mysql_fetch_assoc(sql_query($sql));
	}
	else if($type != '') {
		$sql .= "\nAND `type` = '$type'";
	}
	
	$sql .= "\nORDER BY `key`;";
	
	return sql_query($sql);
}

/**
 * Décoder la valeur d'un paramètre afin de prendre en compte les éléments dynamiques
 * @param value: la valeur à décoder d'un paramètre
 * @param assocs: array contenant des associations de type 'name'=>'dupont'
 * @note: pour insérer une variable dynamique dans la valeur d'un param, il faut
		  écrire le #nom# de la variable comme ça. Pour exécuter une fonction,
		  il faut l'écrire comme ça : {nom,param1,param2,...}
		  Exemple :
		  appparam_read_val("Bonjour #name#, déjà {time} secondes depuis le 01/01/1970, J-{strlen,bob}", array('name'=>'julien'))
		  => "Bonjour julien, déjà 1281315899 secondes depuis le 01/01/1970, J-3"
 * @return la valeur avec les éléments dynamiques décodés
 */
function appparam_read_val($param_val, $assocs = array())
{
	// Partie 1 : évaluation des variables et remplacement par la valeur attendue
	if(!empty($assocs)) {
		$dynitems = array(); $replacements = array();
		foreach($assocs as $item => $replace) {
			$dynitems[] = '#'.$item.'#';
			$replacements[] = $replace;
		}
		$param_val = str_replace($dynitems, $replacements, $param_val);
	}
	// Partie 2 : évaluation des fonctions et remplacement par la valeur attendue
	$pattern = '/\{([A-Za-z0-9-_,+*\/\#]+)\}/';
	$func_list = array();
	preg_match_all($pattern, $param_val, $func_list, PREG_PATTERN_ORDER);
	foreach($func_list[1] as $c_func) {
		$func = explode(',',$c_func);
		if(count($func) == 1) { // fonction sans paramètres
			$param_val = str_replace('{'.$c_func.'}', call_user_func($func[0]), $param_val);
		}
	}
	$func_list = array(); // On répète l'opération une deuxième fois pour gérer les fonctions en paramètres de fonctions
	preg_match_all($pattern, $param_val, $func_list, PREG_PATTERN_ORDER);
	foreach($func_list[1] as $c_func) {
		$func = explode(',',$c_func);
		if(count($func) > 1) { // fonction avec un paramètre ou plus
			$func_params = array();
			for($i = 1 ; $i < count($func) ; ++$i)
				$func_params[] = $func[$i];
			$param_val = str_replace('{'.$c_func.'}', call_user_func_array($func[0],$func_params), $param_val);
		}
	}
	return $param_val;
}

/**
 * Modifier un paramètre
 * @param key: la clé du paramètre à modifier
 * @param value: la nouvelle donnée du paramètre (peut être identique à l'ancienne)
 * @return true si la modification s'est bien passée, false sinon
 */
function appparam_edit($key, $value)
{
	$key = mysql_real_escape_string($key);
	$value = mysql_real_escape_string($value);
	$date = time();
	
	if(strlen($key) < 1 || strlen($key) > 32) return false;
	
	$sql = "UPDATE `AppParam`
			SET `value` = '$value',
				date = $date
			WHERE `key` = '$key'
			LIMIT 1;";
	
	return sql_query($sql);
}

/**
 * Savoir si une clé de paramètre existe
 * @param key: la clé du paramètre à rechercher
 * @return 1 si un paramètre avec la clé spécifiée existe, 0 sinon
 */
function appparam_exists($key) {
	$key = mysql_real_escape_string($key);
	
	$sql = "SELECT `key`
			FROM `AppParam`
			WHERE `key` = '$key'
			LIMIT 1;";
			
	$result = sql_query($sql);
	return mysql_num_rows($result);
}

/**
 * Obtenir la liste des types possibles pour un paramètre, utile pour faire une interface de création de param
 * @return une array() des types disponibles en base
 */
function appparam_get_types()
{
	$sql = 'SHOW COLUMNS FROM `AppParam` WHERE field = \'Type\'';
	$cols = mysql_fetch_assoc(sql_query($sql));
	$types = $cols['Type'];
	
	$types = substr($types,5,strlen($types)-6); // Récupération de la partie qui nous intéresse uniquement
	$types = str_replace('\'', '', $types); // Suppression des apostrophes
	return explode(',', $types); // Retourne une array avec les valeurs possibles du champs `type` (enum)
}

